package com.learning.spring.ioc.resource;

import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.util.FileCopyUtils;

import java.io.IOException;
import java.io.Reader;
import java.nio.charset.Charset;

/**
 * ClassName: Resource
 * Description: Spring 资源抽象接口 org.springframework.core.io.Resource 接口
 * 1、WritableResource：可写资源接口。主要有：
 * - FileSystemResource：文件系统资源，如D://conf/bean/xml
 * - PathResource：支持Path、Url、系统文件路径等表示的资源（spring4.x）
 * <p>
 * 2、AbstractResource：主要有
 * - InputStreamResource：以输入流返回表示的资源
 * - ByteArrayResource：二进制数组表示的资源
 * - ClassPathResource：ClassPath 路径下的资源，相对路径存在
 * - UrlResource：通过 Url 访问资源
 * - BeanDefinitionResource：
 * - ServletContextResource：
 * Date: 2018/7/26 14:09 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class Resource {

    public static void main(String[] args) throws IOException {
//        test();
        test2();
    }

    /**
     * ClassPathResource 是比较常用的，如需要自己加载自定义的配置文件
     * <p>
     * 原理：利用ClassLoader 或者Class 获取资源
     * 1、ClassLoader.getResourceAsStream() 从 ClassPath 根路径下获取。而且路径不能以'/' 开头。
     * if (pathToUse.startsWith("/")) {
     * pathToUse = pathToUse.substring(1);
     * }
     * 2、类 Class.getResourceAsStream() 获取资源
     * path 不以 '/' 开头，就是针对当前的类。是从此类所在的包下取资源
     * path 以 '/' 开头，则是从 ClassPath 下获取资源
     */
    static void test() throws IOException {
        ClassPathResource classPathResource = new ClassPathResource("spring-context.xml");

        String filename = classPathResource.getFilename();
        System.out.println("Filename： " + filename);

        // spring-context.xml
        String path = classPathResource.getPath();
        System.out.println("Path：" + path);

        // 使用 EncodedResource 对资源进行编码
        EncodedResource encodedResource = new EncodedResource(classPathResource, Charset.defaultCharset());

        Reader reader = encodedResource.getReader();

        String s = FileCopyUtils.copyToString(reader);
        System.out.println(s);
    }

    /**
     * FileSystemResource 简单了解
     */
    static void test2() throws IOException {
        FileSystemResource fileSystemResource = new FileSystemResource("G:\\WorkSpace\\Sam\\Learning\\Learning-Spring\\spring-ioc\\src\\main\\resources\\spring-context.xml");
        String filename = fileSystemResource.getFilename();
        System.out.println(filename);

        // G:/WorkSpace/Sam/Learning/Learning-Spring/spring-ioc/src/main/resources/spring-context.xml
        String path = fileSystemResource.getPath();
        System.out.println(path);

        // 使用 EncodedResource 对资源进行编码
        EncodedResource encodedResource = new EncodedResource(fileSystemResource, Charset.forName("UTF-8"));
        Reader reader = encodedResource.getReader();

        String s = FileCopyUtils.copyToString(reader);
        System.out.println(s);
    }
}
